Skip to content

黑客学习记录 -3 -SQL注入

字数
710 字
阅读时间
3 分钟
更新日期
2/6/2017

实验环境:MySql

Sql注入原理

  • 通过 and xor 等语句测试是否注入到了数据库
  • order by 1 order by 是按照某列的顺序来对数据表排序 1是列 通过这个可以知道表中有多少列
  • union select union特点是select要与前面的一致
  • union select 1,2,3,4,5 sql就会返回1,2,3,4,5

可以将前面注入错误的内容,以便union select可以显示内容

exists()判断括号内的东西是否存在

id=1' and exists(select * from users)--+ 查看存不存在users这个数据表

存在的话,下一步
id=1' and exists(select password from users)--+ 查看users这个表里存不存在password这个字段

可以看到这里是猜数据表和字段,要么是用字典去fuzz
很繁琐,有没有更好的办法呢?
有,Mysql有个元数据库 information_schema

information_schema

information_schema 是一个字典,
包含了整个 mysql 的所有信息,
本质上是一个 database
里面有三个表比较常用,
分别是 tablescolumns ,还有 schemata

  • information_schema.schemata
    • 储存了所有数据库的信息,
    • 字段:schema_name 存放数据库名字
  • information_schema.tables
    • 储存了所有表的信息
    • table_name //存放表格的名字
    • table_schema //存放表格所在的数据库名字
  • information_schema.columns
    • 储存了所有列的信息
    • column_name //存放列的名字
    • table_name //存放表格的名字
    • table_schema //存放表格所在的数据库名字

for example

查找数据库有哪些数据库
id=1' union select 1,schema_name,3,4,5 from information_schema.schemata--+

小节

网上有很多种sql注入的类型,什么数字型,字符型,搜索型…..

sql注入漏洞产生最根本的原因是什么?
是把用户输入的数据当做代码去执行,

白盒分析

get方法接收id,单引号包裹后,直接动态构造sql查询语句

黑盒分析

  • id=1 and 1=1
  • id=1 and 1=0
  • 判断是否当作代码执行了

盲注&&显著

有的代码执行错误后不会返回任何信息,只有执行正确才会返回信息

  • 显注是 :我问数据库问题,他巴拉巴拉给我一通说
  • 盲注是:我问他问题,他只能回复是或者不是
  1. exists(),一样可以猜出数据表和其中字段
  2. id=1 and exists(select password from users)--+
  3. substr()用来截取字符串
  4. id=1 and (substr(user(),1,1)>'a')--+
  5. 用substr截取每一位判断比较(ascii码比较) 通常使用 二分法

小节

  • 注入的利用方法很多
  • 报错注入
  • 延时注入 sleep()

撰写